#include<iostream>
#include<vector>
#include<string>
#include<unistd.h>
#include<pthread.h>

//本代码目的：体现线程先描述后组织的结构
//创建多线程，我们给的值从数组name里面拿
//有多线程就要先描述后组织，所以把创建的轻量级进程放在数组里面，转而对数组进行管理
//for将每个进程地址打出来，再for循环pthread_join回收全部新线程再让主线程退出

void* thread_routine(void* args)
{
    //对args强转就可以获取到数组中的每一个线程名字
    std::string threadname = static_cast<const char*>(args);
    int cnt = 10;
    while (cnt)
    {
        printf("new thread is running, name is : %s\n", threadname.c_str());
        cnt--;
        if(cnt == 3)
        {
            printf("%s is dead...\n", threadname.c_str());
            //这会导致中断，一中断整个线程结束
            // int *p = nullptr;
            // *p = 0;
        }
        sleep(1);
    }
    // 如果线程执行完了自己的入口函数，表明该线程退出
    return nullptr;

} 

int gnum = 5;
int main()
{
    std::vector<pthread_t> tids;
    for(int i=0;i<gnum;i++)
    {
        pthread_t tid;
        char* name=new char[64];
        // 生成线程名
        snprintf(name,64,"thread-%d",i+1);
        int n = pthread_create(&tid,nullptr,thread_routine,name);
        (void)n;
        tids.push_back(tid);
    }
    sleep(1);
    //打印id
    for(auto& tid:tids)
    {
        printf("main creat a new thread,new thread id is: 0x%lx\n",tid);
    }
    //回收线程
    // 多线程代码中，我们往往想让谁最后退出？？主线程！ --- 线程也要进行等待
    //类似进程wait!要对新线程进行等待：不然也会造成类似僵尸进程的问题！
    for (auto& tid:tids)
    {
        pthread_join(tid,nullptr);
        printf("thread end..., 退出的线程是: %lu\n", tid);
    }
    printf("main end...\n");
    
    // 如果main结束，表示主线程结束，同时也表示当前进程结束 -- 释放资源
    //进程结束，所有线程全部退出哪怕没有执行完
    return 0;
}